/* Copyright (c) 2003 The Nutch Organization. All rights reserved. */ /* Use subject to the conditions in http://www.nutch.org/LICENSE.txt. */ package net.nutch.util; import java.util.logging.*; import java.io.*; import java.text.*; import java.util.Date; /** Prints just the date and the log message. */ public class LogFormatter extends Formatter { private static final String FORMAT = "yyMMdd HHmmss"; private static final String NEWLINE = System.getProperty("line.separator"); private final Date date = new Date(); private final SimpleDateFormat formatter = new SimpleDateFormat(FORMAT); private static boolean loggedSevere= false; private static boolean showThreadIDs = false; // install when this class is loaded static { Handler[] handlers = LogFormatter.getLogger("").getHandlers(); for (int i = 0; i < handlers.length; i++) { handlers[i].setFormatter(new LogFormatter()); handlers[i].setLevel(Level.FINEST); } } /** Gets a logger and, as a side effect, installs this as the default * formatter. */ public static Logger getLogger(String name) { // just referencing this class installs it return Logger.getLogger(name); } /** When set true, thread IDs are logged. */ public static void setShowThreadIDs(boolean showThreadIDs) { LogFormatter.showThreadIDs = showThreadIDs; } /** * Format the given LogRecord. * @param record the log record to be formatted. * @return a formatted log record */ public synchronized String format(LogRecord record) { StringBuffer buffer = new StringBuffer(); // the date date.setTime(record.getMillis()); formatter.format(date, buffer, new FieldPosition(0)); // the thread id if (showThreadIDs) { buffer.append(" "); buffer.append(record.getThreadID()); } // handle SEVERE specially if (record.getLevel() == Level.SEVERE) { buffer.append(" SEVERE"); // flag it in log loggedSevere= true; // set global flag } // the message buffer.append(" "); buffer.append(formatMessage(record)); buffer.append(NEWLINE); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); buffer.append(sw.toString()); } catch (Exception ex) { } } return buffer.toString(); } /** * Returns <code>true</code> if this <code>LogFormatter</code> has * logged something at <code>Level.SEVERE</code> */ public static boolean hasLoggedSevere() { return loggedSevere; } /** Returns a stream that, when written to, adds log lines. */ public static PrintStream getLogStream(final Logger logger, final Level level) { return new PrintStream(new ByteArrayOutputStream() { private int scan = 0; private boolean hasNewline() { for (; scan < count; scan++) { if (buf[scan] == '\n') return true; } return false; } public void flush() throws IOException { if (!hasNewline()) return; logger.log(level, toString().trim()); reset(); scan = 0; } }, true); } }